﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using _24_ChainOfResponsibility.Handler;

namespace _24_ChainOfResponsibility
{
    class Program
    {
        /*
         职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间耦合关系。将这个
         对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。

            责任链有点： 当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
            请求者不用管哪个对象来处理，反正该请求会被处理就对了。
            使得接受者和发送者都没有对方的明确信息，且链中的对象自己也不知道链的结构。结果是职责链可简化对象的相互连接，他
            们仅需要保持一个指向其后继者的引用，而不需要保持它所有的候选接受者的引用。极大降低了耦合度

            由于是客户端定义链的结构，可以随时的增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
            但是一个请求有可能到了链的末端也得不到处理，或者因为没有正确配置而得不到处理。



             */
        static void Main(string[] args)
        {
            // ChainOfRes();
            CommonManager jinli = new CommonManager("经理");
            Majordomo zongjian = new Majordomo("重剑");
            GeneralManager zhongjingli = new GeneralManager("中经历");

            jinli.SetSuperior(zongjian);
            zongjian.SetSuperior(zhongjingli);

            Request request = new Request();
            request.RequestType = "请假";
            request.Number = 1;
            jinli.RequestApplications(request);

            Request request1 = new Request();
            request.RequestType = "请假";
            request.Number = 2;
            jinli.RequestApplications(request);

            Request request2 = new Request();
            request.RequestType = "请假";
            request.Number = 5;
            jinli.RequestApplications(request);

            Request request3 = new Request();
            request.RequestType = "加薪";
            request.Number = 333;
            jinli.RequestApplications(request);

            Request request4 = new Request();
            request.RequestType = "加薪";
            request.Number = 600;
            jinli.RequestApplications(request);

            Console.Read();
        }

        private static void ChainOfRes()
        {
            Handler.Handler h1 = new ConcreteHandler1();
            Handler.Handler h2 = new ConcreteHandler2();
            Handler.Handler h3 = new ConcreteHandler3();

            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);

            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };
            foreach (var requst in requests)
            {
                h1.HandlerRequest(requst);
            }
        }
    }
}
